import sys
from StringIO import StringIO
import antlr3 # importamos librerias de antlr3
from LL1AST.LL1ASTLexer import LL1ASTLexer # importamos nuestro lexer generado por ANTLRWorks
from LL1AST.LatexParser import LatexParser # Importamos nuestro parser generado por ANTLRWorks
from LL1AST.ArbolConAtributos import adaptor, ArbolConAtributos

#Constantes
USAGE = 'Modo de uso: \npython tlen.py -w <cadena a procesar> \npython tlen.py -f <archivo a procesar>' # Modo de uso
ENCABEZADO_PS = '%!PS-Adobe-3.0 EPSF-3.0\n%%BoundingBox: 0 0 55 33\n0 250 translate\n50 50 scale\n.03 setlinewidth\n/Courier findfont setfont\n'
DIBUJAR_ARBOL = False

# LLeva a cabo el procesamiento de la cadena: parseo, creacion del arbol, seteo de atributos, escritura en archivo .ps
def procesar(cadena, id):
    input = StringIO(cadena)
    
    char_stream = antlr3.ANTLRInputStream(input) #asignamos archivo de entrada a ANTLR
    lexer = LL1ASTLexer(char_stream) # Asignamos stream devuelto por ANTLR al lexer
    tokens = antlr3.CommonTokenStream(lexer) # Creamos stream de tokens con el lexer
    parser = LatexParser(tokens) # Creamos nuevo parser y le pasamos el lexer de parametro
    adaptador = adaptor() # Instanciamos adaptor
    parser.setTreeAdaptor(adaptador) # Definimos el adaptador para el arbol que genere el parser
    
    
    result = parser.program() # Ejecutamos la produccion program del parser
    
    
    print 'Fin proceso cadena: '+ cadena + "\n"
    
    try:	     
	result.tree.setAtributos(1.0)
	result.tree.setPosiciones(0.0, 0.0)
        escribirArchivoPS(cadena,id, result.tree)
	
	if DIBUJAR_ARBOL:
	    dibujarArbol(result.tree)
    except AttributeError, e:
	pass
    
    
# Genera un archivo .ps cargando los datos obtenidos del procesamiento
def escribirArchivoPS(cadena, id, tree):
    
    archivoPS = open("resultados/resultado"+str(id)+".ps", "w") # Creamos el archivo ouput
    archivoPS.write(ENCABEZADO_PS) # Escribimos el encabezado
    archivoPS.write(tree.archivo) # Escribimos la expresion
    archivoPS.write(tree.armarLineaPS(0, -0.5, 0.25,0.25, "cadena:"+ cadena))
    archivoPS.write('showpage\n') # Escribimos la ultima sentencia
    archivoPS.close


# Procesa un archivo
def procesarArchivo(nombreArchivo):
    archivo = open(nombreArchivo, 'r')
    i = 0
    for line in archivo:
        cadena = line.replace('\r\n','').replace('\n', '')
        procesar(cadena, i)
        i = i + 1
    archivo.close()
    print 'Fin proceso archivo: '+ nombreArchivo

# Dibuja un arbol
def dibujarArbol(nodo):
    nodo.showArbol(0)
    
# MAIN   
def main():
    if (len(sys.argv) > 1):
        modo = sys.argv[1]
        if modo == '-w' :
            cadena = sys.argv[2]
	    procesar(cadena,0)
	elif modo == '-f':
            archivo = sys.argv[2]
            procesarArchivo(archivo)
        else:
            print USAGE
    else:
        print USAGE 

if __name__ == "__main__":
    main()    